package encaps.action;

import encaps.entities.Grant;
import encaps.entities.Role;
import encaps.resources.Grants;
import encaps.resources.Image;
import encaps.resources.Labels;
import encaps.resources.Response;
import encaps.security.SecuritySystem;
import encaps.utils.Provider;
import encaps.utils.RoleGrantGenreEnum;
import encaps.utils.XMLHelper;
import org.jdom.Element;

public class ViewRoleListAction extends Action {

    private ActionContext actionContext;
    public static final String VIEW_ROLE_LIST = "viewRoleList";
    public static final String ROLE = "Role";

    public ViewRoleListAction(ActionContext context, Grant requiredGrant) {
        this.actionContext = context;
        this.requiredGrant = requiredGrant;
    }

    @Override
    public Element execute() throws ActionExecutionException {
        try {
            String[] result = Provider.getUnique(RoleGrantGenreEnum.ROLE);
            return toXMLElement(result, SecuritySystem.getRole(actionContext.getUserRole()));
        } catch (Exception e) {
            throw new ActionExecutionException(e);
        }
    }

    public Element toXMLElement(String[] result, Role userRole) throws ActionExecutionException {
        Element resultXML = XMLHelper.createElement(Response.RESPONSE);
        Element e = XMLHelper.addChild(resultXML, Response.TABLE);
        //Создаем заголовок страницы
        XMLHelper.addChild(e, Response.HEADER, Labels.getLabel(Labels.VIEW_ROLE_LIST));
        XMLHelper.addChild(e, XMLHelper.createImageLink(Image.getImage(Image.CREATE_ROLE), ShowEmptyRolePageAction.SHOW_EMPTY_ROLE_PAGE, Long.valueOf("12")));
        //Создаем заголовки столбцов таблиц
        Element headers = XMLHelper.createElement(Response.COLUMN_HEADERS);
        XMLHelper.addChild(headers, Response.COLUMN_HEADER, Labels.getLabel(Labels.ROLE_NAME));
        XMLHelper.addChild(e, headers);
        //Заполняем таблицу
        XMLHelper.addChild(e, logToTableRows(result, userRole));

        //Заполняем информацию, необходимую для пагинации
        return resultXML;
    }

    private Element logToTableRows(String[] result, Role userrole) throws ActionExecutionException {
        Element rows = XMLHelper.createElement(Response.ROWS);
        for (String role : result) {
            Element row = XMLHelper.addChild(rows, Response.ROW);
            //Добавление ячеек в строку таблицы. Каждая ячейка соответствует
            //одному полю (одной колонке) таблицы
            Element cell = XMLHelper.addChild(row, Response.CELL, role);
            cell.setAttribute(Response.TYPE, Response.TEXT);
            //Ссылка на удаление
            if (userrole.hasGrant(Grants.VIEW_ROLE)) {
                Element viewLinkCell = XMLHelper.addChild(row, Response.CELL);
                viewLinkCell.setAttribute(Response.TYPE, Response.LINK);
                viewLinkCell.addContent(XMLHelper.createLink(Labels.getLabel(Labels.VIEW_LINK), ViewRoleAction.VIEW_ROLE, role));

            }

            if (userrole.hasGrant(Grants.EDIT_ROLE)) {
                Element editLinkCell = XMLHelper.addChild(row, Response.CELL);
                if (("admin".equals(role)) || ("user".equals(role)) || ("moderator".equals(role)) || ("guest".equals(role))) {
                    editLinkCell.setAttribute(Response.TYPE, Response.TEXT);
                    editLinkCell.addContent("");
                } else {
                    editLinkCell.setAttribute(Response.TYPE, Response.LINK);
                    editLinkCell.addContent(XMLHelper.createLink(Labels.getLabel(Labels.EDIT_LINK), EditRoleAction.EDIT_ROLE, role));
                }
            }
            if (userrole.hasGrant(Grants.DELETE_ROLE)) {
                Element deleteLinkCell = XMLHelper.addChild(row, Response.CELL);
                if (("admin".equals(role)) || ("user".equals(role)) || ("moderator".equals(role)) || ("guest".equals(role))) {
                    deleteLinkCell.setAttribute(Response.TYPE, Response.TEXT);
                    deleteLinkCell.addContent("");
                } else {
                    deleteLinkCell.setAttribute(Response.TYPE, Response.LINK);
                    deleteLinkCell.addContent(XMLHelper.createLink(Labels.getLabel(Labels.DELETE_LINK), DeleteRoleAction.DELETE_ROLE, role));
                }
            }
        }
        return rows;
    }
}
